package com.excilys.capicsoubank.dao;

import java.util.List;

import org.joda.time.DateTime;

import com.excilys.capicsoubank.entities.Account;
import com.excilys.capicsoubank.entities.Transaction;
import com.excilys.capicsoubank.entities.TransactionType;

/**
 * @author Sébastien Bihan
 * 
 */
public interface TransactionDao extends GenericDao<Transaction> {

	/**
	 * Retourne la liste des transactions de types donnés d'un compte triée par
	 * date décroissante et paginée avec le nombre total de transactions sans
	 * pagination.
	 * 
	 * @param account
	 *            le compte
	 * @param startDate
	 *            la date de départ des transactions
	 * @param endDate
	 *            la date de fin des transactions
	 * @param types
	 *            un tableau contenant les types de transaction à prendre en
	 *            compte
	 * @param resultSize
	 *            le nombre de résultats à retourner
	 * @param offset
	 *            la première transaction à considérer
	 * @return la liste des transactions d'un compte triée par date décroissante
	 */
	List<Transaction> getTransactionByAccountByPeriodByTypeWithPagination(
			Account account, DateTime startDate, DateTime endDate,
			TransactionType[] types, int resultSize, int offset);

	/**
	 * Retourne la liste des transactions de types donnés d'un compte triée par
	 * date décroissante et paginée avec le nombre total de transactions sans
	 * pagination.
	 * 
	 * @param account
	 *            le compte
	 * @param startDate
	 *            la date de départ des transactions
	 * @param endDate
	 *            la date de fin des transactions
	 * @param types
	 *            un tableau contenant les types de transaction à prendre en
	 *            compte
	 * @return la liste des transactions d'un compte triée par date décroissante
	 */
	Long getCountTransactionByAccountByPeriodByType(Account account,
			DateTime startDate, DateTime endDate, TransactionType[] types);

	/**
	 * Retourne le total des transactions de types donnés d'un compte pour une
	 * période.
	 * 
	 * @param account
	 *            le compte
	 * @param startDate
	 *            la date de départ
	 * @param endDate
	 *            la date de fin
	 * @param types
	 *            un tableau contenant les types de transaction à prendre en
	 *            compte
	 * @return le total des transactions de types donnés d'un compte pour une
	 *         période.
	 */
	long getSumTransactionsByPeriodByType(Account account, DateTime startDate,
			DateTime endDate, TransactionType[] types);

	/**
	 * Retourne la liste des opérations pour un compte entre deux dates.
	 * 
	 * @param account
	 *            Le compte
	 * @param startDate
	 *            La date de début
	 * @param endDate
	 *            La date de fin
	 * @param types
	 *            un tableau contenant les types de transaction à prendre en
	 *            compte
	 * @return La liste des opérations
	 */
	List<Transaction> getTransactionByAccountByYearByMonthByType(
			Account account, DateTime startDate, DateTime endDate,
			TransactionType[] types);
}
